fix FileIO openTempFile on Windows
authorJoey Hess <joeyh@joeyh.name>
Thu, 30 Jan 2025 18:23:00 +0000 (14:23 -0400)
committerJoey Hess <joeyh@joeyh.name>
Thu, 30 Jan 2025 18:32:14 +0000 (14:32 -0400)
When an UNC-style path is passed into openTempFile, the returned file
starts with that same style of path. Which can cause problems, eg piping
that filename to git failed. So, convert the output filename to be
relative to the input temp directory.

Utility/FileIO.hs

index ac7fe7f3406e2addc64eea273de5fb02857d28a4..e0cd546a286309f7cf60151d5e22a023aa86baf3 100644 (file)
@@ -37,7 +37,9 @@ import System.File.OsPath
 -- https://github.com/haskell/file-io/issues/39
 import Utility.Path.Windows
 import Utility.OsPath
+import System.OsPath
 import System.IO (IO, Handle, IOMode)
+import Prelude (return)
 import qualified System.File.OsPath as O
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
@@ -96,7 +98,10 @@ appendFile' f b = do
 openTempFile :: OsPath -> OsPath -> IO (OsPath, Handle)
 openTempFile p s = do
        p' <- toOsPath <$> convertToWindowsNativeNamespace (fromOsPath p)
-       O.openTempFile p' s
+       (t, h) <- O.openTempFile p' s
+       -- Avoid returning mangled path from convertToWindowsNativeNamespace
+       let t' = p </> takeFileName t
+       return (t', h)
 #endif
 
 #else